package javagame;

import gameobjects.*;
import gameobjects.Objekat.oblik;
import gameobjects.PowerUp.tip_powerup;
import gameobjects.Protivnik.tip_protivnika;

import java.util.LinkedList;

import gamethreads.*;
import gamesound.*;

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

import javagame.Play.game_mode;

public abstract class Level extends BasicGameState {
	
	public static final int bodovi[] = {100, 300, 200, 400, 200, 300, 10000, 50}; //{sivi, crni, top, brod, podmornica, helikopter, boss1, dolar/prolaz}
	public static final int constDelta = 25;
	
	//mod igre mod1-obican, mod2-niti, mod3-niti komunikacija
	
	protected Igrac tenkIgrac;
	protected Igrac2 tenkIgrac2;
	protected Protivnik [] protivnik;
	protected ProtivnikT [] protivnikT;
	protected Kolizija kolizija;
	protected Zvuk zvuk;
	protected game_mode mod;
	protected PowerUp [] budzenje;
	protected boolean otvoriProlaz;
	protected boolean pocniNivo;
	protected boolean quit;
	protected boolean shot;
	protected boolean shot2;
	protected boolean kreiraniProtivnici;
	protected boolean dvaIgraca;
	
	public boolean isPocniNivo () {
		return pocniNivo;
	}
	
	public boolean isKreiraniProtivnici () {
		return kreiraniProtivnici;
	}
	
	public abstract void initProtivnika () throws SlickException;
	public abstract void resetProlaz ();
	public abstract void postaviProtivnike ();
	
	public boolean mozeJa(Protivnik p) { // kolizija protivnika i prvog igraca
		if (tenkIgrac.isZiv()
				&& p.getProtivnikX() + p.getSizeX() >= tenkIgrac.getTenkX()
				&& p.getProtivnikX() <= tenkIgrac.getTenkX()+50 
				&& p.getProtivnikY() <= tenkIgrac.getTenkY()+50
				&& p.getProtivnikY() + p.getSizeY() >= tenkIgrac.getTenkY()
				&& p.getVrsta() != tip_protivnika.HELIKOPTER) {
			if(p.isPath()) p.setPath(false);
			return false;
		}	
		else {
			p.setStop(false);
			return true;
		}
	}
	
	public boolean mozeJaDva(Protivnik p) { // kolizija protivnika i drugog igraca
		if (tenkIgrac2.isZiv() && Nivo.isDvaIgraca()
				&& p.getProtivnikX() + p.getSizeX() >= tenkIgrac2.getTenkX()
				&& p.getProtivnikX() <= tenkIgrac2.getTenkX()+50 
				&& p.getProtivnikY() <= tenkIgrac2.getTenkY()+50
				&& p.getProtivnikY() + p.getSizeY() >= tenkIgrac2.getTenkY()
				&& p.getVrsta() != tip_protivnika.HELIKOPTER) {
			p.setPath(false);
			p.setTraziPut(false);
			return false;
		}
		else {
			p.setStop2(false);
			return true;
		}
	}
	
	//ovo prepravi da bude kao ovo gore
	public boolean mozeJa(ProtivnikT pt) { //dodaj za bossa
		if (pt.getProtivnikX() + 50 >= tenkIgrac.getTenkX()
	      		 && pt.getProtivnikX() <= tenkIgrac.getTenkX()+50
	      		 && pt.getProtivnikY() <= tenkIgrac.getTenkY()+50
	      		 && pt.getProtivnikY() + 50 >= tenkIgrac.getTenkY())
			return false;
		else {
			pt.setStop(false);
			return true;
		}
	}
	
	public boolean mozeJaDva(ProtivnikT pt) { // kolizija protivnika i drugog igraca
		if (tenkIgrac2.isZiv() && Nivo.isDvaIgraca()
				&& pt.getProtivnikX() + pt.getSizeX() >= tenkIgrac2.getTenkX()
				&& pt.getProtivnikX() <= tenkIgrac2.getTenkX()+50 
				&& pt.getProtivnikY() <= tenkIgrac2.getTenkY()+50
				&& pt.getProtivnikY() + pt.getSizeY() >= tenkIgrac2.getTenkY())
			return false;
		else {
			pt.setStop2(false);
			return true;
		}
	}
	
	public boolean moguJa () { //kolizija prvog igraca sa protivnicima
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false && protivnik[i].getVrsta() != tip_protivnika.HELIKOPTER) {
				Protivnik tempPr = protivnik[i];
			   		if (tenkIgrac.getTenkX() + 50 >= tempPr.getProtivnikX()
			      		 && tenkIgrac.getTenkX() <= tempPr.getProtivnikX() + tempPr.getSizeX()
			      		 && tenkIgrac.getTenkY() <= tempPr.getProtivnikY() + tempPr.getSizeY()
			      		 && tenkIgrac.getTenkY() + 50 >= tempPr.getProtivnikY())
			   			return false;
			}
		return true;
	}
	
	public boolean moguJaDva () { //kolizija drugog igraca sa protivnicima
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false && protivnik[i].getVrsta() != tip_protivnika.HELIKOPTER) {
				Protivnik tempPr = protivnik[i];
			   		if (tenkIgrac2.getTenkX() + 50 >= tempPr.getProtivnikX()
			      		 && tenkIgrac2.getTenkX() <= tempPr.getProtivnikX() + tempPr.getSizeX()
			      		 && tenkIgrac2.getTenkY() <= tempPr.getProtivnikY() + tempPr.getSizeY()
			      		 && tenkIgrac2.getTenkY() + 50 >= tempPr.getProtivnikY())
			   			return false;
			}
		return true;
	}
	
	//i ovo popravi da bude kao ono gore
	public boolean moguJaPT () {// dodaj za bossa
		for(int i=0; i<protivnikT.length; i++)
			if(protivnikT[i].isUbiven() == false) {
				ProtivnikT tempPr = protivnikT[i];		
		   		if (tenkIgrac.getTenkX()+50 >= tempPr.getProtivnikX()
		      		 && tenkIgrac.getTenkX() <= tempPr.getProtivnikX()+50
		      		 && tenkIgrac.getTenkY() <= tempPr.getProtivnikY()+50
		      		 && tenkIgrac.getTenkY()+50 >= tempPr.getProtivnikY())
		   			return false;
			}
		return true;
	}
	
	public boolean moguJaDvaPT () {// dodaj za bossa
		for(int i=0; i<protivnikT.length; i++)
			if(protivnikT[i].isUbiven() == false) {
				ProtivnikT tempPr = protivnikT[i];		
		   		if (tenkIgrac2.getTenkX()+50 >= tempPr.getProtivnikX()
		      		 && tenkIgrac2.getTenkX() <= tempPr.getProtivnikX()+50
		      		 && tenkIgrac2.getTenkY() <= tempPr.getProtivnikY()+50
		      		 && tenkIgrac2.getTenkY()+50 >= tempPr.getProtivnikY())
		   			return false;
			}
		return true;
	}
	
	public boolean mozeIgrac () {
		if ((tenkIgrac.isZiv() && tenkIgrac2.isZiv())
				 && tenkIgrac.getTenkX() + 50 >= tenkIgrac2.getTenkX()
	      		 && tenkIgrac.getTenkX() <= tenkIgrac2.getTenkX()+50
	      		 && tenkIgrac.getTenkY() <= tenkIgrac2.getTenkY()+50
	      		 && tenkIgrac.getTenkY() + 50 >= tenkIgrac2.getTenkY())
			return false;
		return true;
	}
	
	public boolean mozeProtivnik (Protivnik p) {	// kolizija protivnika medjusobno
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false && protivnik[i].getVrsta() != tip_protivnika.HELIKOPTER)
				if(p!=protivnik[i]) {
					Protivnik tempPr = protivnik[i];
			   		if (p.getProtivnikX() + p.getSizeX() >= tempPr.getProtivnikX()
			      		 && p.getProtivnikX() <= tempPr.getProtivnikX() + tempPr.getSizeX()
			      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + tempPr.getSizeY()
			      		 && p.getProtivnikY() + p.getSizeY() >= tempPr.getProtivnikY()) {
			   			if (p.isPath()) p.setPath(false);
						return false;
			   		}
			   		//else protivnik[i].setStop(false);
				}
		return true;
	}
	
	//ovo popravi da bude kao gore
	public boolean mozeProtivnik (ProtivnikT pt) {	
		for(int i=0; i<protivnikT.length; i++)
			if(protivnikT[i].isUbiven() == false)
				if(pt!=protivnikT[i]) {
					ProtivnikT tempPr = protivnikT[i];
			   		if (pt.getProtivnikX()+50 >= tempPr.getProtivnikX()
			      		 && pt.getProtivnikX() <= tempPr.getProtivnikX()+50
			      		 && pt.getProtivnikY() <= tempPr.getProtivnikY()+50
			      		 && pt.getProtivnikY()+50 >= tempPr.getProtivnikY())
			   			return false;
				}
		return true;
	}
	
	/*public boolean mozePodmornica (Protivnik p, int delta) {	
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false) {
				if(p!=protivnik[i] && protivnik[i].getVrsta() == tip_protivnika.PODMORNICA) {
					Protivnik tempPr = protivnik[i];
			   		if (p.getProtivnikX() + 75 >= tempPr.getProtivnikX() - 15
			      		 && p.getProtivnikX() - 15 <= tempPr.getProtivnikX() + 75
			      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + 100
			      		 && p.getProtivnikY() + 100 >= tempPr.getProtivnikY()) {
			   			protivnik[i].promeniSmer(delta);
			   			return false;
			   		}
				}
				else if(p!=protivnik[i] && protivnik[i].getVrsta() == tip_protivnika.BROD 
						&& (protivnik[i].getSmer() == 0 || protivnik[i].getSmer() == 1)) {
					Protivnik tempPr = protivnik[i];
			   		if (p.getProtivnikX() + 75 >= tempPr.getProtivnikX()
			      		 && p.getProtivnikX() - 15 <= tempPr.getProtivnikX() + 50
			      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + 200
			      		 && p.getProtivnikY() + 100 >= tempPr.getProtivnikY()) {
			   			protivnik[i].promeniSmer(delta);
			   			return false;
			   		}
				}
				else if(p!=protivnik[i] && protivnik[i].getVrsta() == tip_protivnika.BROD 
						&& (protivnik[i].getSmer() == 2 || protivnik[i].getSmer() == 3)) {
					Protivnik tempPr = protivnik[i];
			   		if (p.getProtivnikX() + 75 >= tempPr.getProtivnikX()
			      		 && p.getProtivnikX() - 15 <= tempPr.getProtivnikX() + 200
			      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + 50
			      		 && p.getProtivnikY() + 100 >= tempPr.getProtivnikY()) {
			   			protivnik[i].promeniSmer(delta);
			   			return false;
			   		}
				}
			}
		return true;
	}
	
	public boolean mozeBrod (Protivnik p, int delta) {	
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false) {
				if(p != protivnik[i] && protivnik[i].getVrsta() == tip_protivnika.BROD) {
					Protivnik tempPr = protivnik[i];
			   		if (p.getProtivnikX() + 50 >= tempPr.getProtivnikX()
			      		 && p.getProtivnikX() <= tempPr.getProtivnikX() + 50
			      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + 200
			      		 && p.getProtivnikY() + 200 >= tempPr.getProtivnikY()
			      		 && (p.getSmer() == 0 || p.getSmer() == 1))  {
			   			protivnik[i].promeniSmer(delta);
			   			return false;
			   		}
				   	if (p.getProtivnikX() + 200 >= tempPr.getProtivnikX()
				      		 && p.getProtivnikX() <= tempPr.getProtivnikX() + 200
				      		 && p.getProtivnikY() <= tempPr.getProtivnikY() + 50
				      		 && p.getProtivnikY() + 50 >= tempPr.getProtivnikY()
				      		 && (p.getSmer() == 2 || p.getSmer() == 3)) {
				   			protivnik[i].promeniSmer(delta);
				   			return false;
				   	}
				}
				else if(p != protivnik[i] && protivnik[i].getVrsta() == tip_protivnika.PODMORNICA) {}
			}
		return true;
	}*/
	
	public boolean moze (LinkedList<Objekat> objekatList, double x, double y ) { //kolizija sa preprekama
		for(int i=0; i<objekatList.size(); i++) {
			Objekat tempOb = objekatList.get(i); 
	   		/*if(tempOb.getObl() == oblik.KRUG)
	   		if(
	   				 Math.sqrt(
	   						 Math.abs(objekatList.get(i).xOb) 
	   						 * 
	   						 Math.abs(objekatList.get(i).xOb)
	   						 +    						 
	   						 Math.abs(objekatList.get(i).yOb)
	   						 * 
	   						 Math.abs(objekatList.get(i).yOb)
	   						 )
	   						  (objekatList.get(i).size/2 + 25)
	   						 ) return false;
	   		 
	   	 
	   	 	else */
	   		 
			if(tempOb.getObl() == oblik.KVADRAT) {
				if ((x <= tempOb.getxOb()+tempOb.getSize()
			    		 && x+50 >= tempOb.getxOb()
			    		 && y <= tempOb.getyOb()+tempOb.getSize()
			    		 && y+50 >= tempOb.getyOb())) {
					return false;
				}
			}
			if(tempOb.getObl() == oblik.PRAVOUGAONIK) {
				Pravougaonik p = (Pravougaonik) tempOb;
	   			if ((x <= p.getxOb()+p.getxSize()
		        		 && x+50 >= p.getxOb()
		        		 && y <= p.getyOb()+p.getySize()
		        		 && y+50 >= p.getyOb()))
	   				return false;
			}
		}
		return true;
	}
	
	//ista metoda kao i gore samo pamti poslednju prepreku u koju je udareno
	public boolean moze(LinkedList<Objekat> objekatList, Protivnik pr) { //kolizija sa preprekama
		float x = pr.getProtivnikX();
		float y = pr.getProtivnikY();
		for(int i=0; i<objekatList.size(); i++) {
			Objekat tempOb = objekatList.get(i); 
			if(tempOb.getObl() == oblik.KVADRAT) {
				if ((x <= tempOb.getxOb()+tempOb.getSize()
			    		 && x+50 >= tempOb.getxOb()
			    		 && y <= tempOb.getyOb()+tempOb.getSize()
			    		 && y+50 >= tempOb.getyOb())) {
					if(!pr.isPath() && pr.isShooting()) {
						pr.setPoslednjeUdario(i);
						pr.setTraziPut(true);
					}
					return false;
				}
			}
			if(tempOb.getObl() == oblik.PRAVOUGAONIK) {
				Pravougaonik p = (Pravougaonik) tempOb;
	   			if ((x <= p.getxOb()+p.getxSize()
		        		 && x+50 >= p.getxOb()
		        		 && y <= p.getyOb()+p.getySize()
		        		 && y+50 >= p.getyOb())) {
					if(!pr.isPath() && pr.isShooting()) {
						pr.setPoslednjeUdario(i);
						pr.setTraziPut(true);
					}
	   				return false;
	   			}
			}
		}
		return true;
	}
	
	public boolean mozeDaZaobidje(LinkedList<Objekat> objekatList, int index, int smer) {
		if(objekatList.get(index).getObl() == oblik.KVADRAT) return true;
		else {
			Pravougaonik p = (Pravougaonik) objekatList.get(index);
			if(p.getxSize() == 50 || p.getySize() == 50) return true;  
			return false;
		}
	}
	
	//ista metoda kao i gore samo pamti poslednju prepreku u koju je udareno
	public boolean moze(LinkedList<Objekat> objekatList, ProtivnikT pt) { //kolizija sa preprekama
		float x = pt.getProtivnikX();
		float y = pt.getProtivnikY();
		for(int i=0; i<objekatList.size(); i++) {
			Objekat tempOb = objekatList.get(i); 
			if(tempOb.getObl() == oblik.KVADRAT) {
				if ((x <= tempOb.getxOb()+tempOb.getSize()
			    		 && x+50 >= tempOb.getxOb()
			    		 && y <= tempOb.getyOb()+tempOb.getSize()
			    		 && y+50 >= tempOb.getyOb()))
					return false;
			}
			if(tempOb.getObl() == oblik.PRAVOUGAONIK) {
				Pravougaonik p = (Pravougaonik) tempOb;
	   			if ((x <= p.getxOb()+p.getxSize()
		        		 && x+50 >= p.getxOb()
		        		 && y <= p.getyOb()+p.getySize()
		        		 && y+50 >= p.getyOb()))
	   				return false;
			}
		}
		return true;
	}
	
	public boolean mozeFull(LinkedList<Objekat> objekatList, double x, double y, int sizeX, int sizeY) {
		for(int i=0; i<objekatList.size(); i++) {
			Objekat tempOb = objekatList.get(i);
			if(tempOb.getObl() == oblik.KVADRAT) {
				if ((x <= tempOb.getxOb()+tempOb.getSize()
			    		 && x+sizeX >= tempOb.getxOb()
			    		 && y <= tempOb.getyOb()+tempOb.getSize()
			    		 && y+sizeY >= tempOb.getyOb()))
					return false;
			}
			if(tempOb.getObl() == oblik.PRAVOUGAONIK) {
				Pravougaonik p = (Pravougaonik) tempOb;
	   			if ((x <= p.getxOb()+p.getxSize()
		        		 && x+sizeX >= p.getxOb()
		        		 && y <= p.getyOb()+p.getySize()
		        		 && y+sizeY >= p.getyOb()))
	   				return false;
			}
		}
		return true;		
	}
	
	public boolean mozeTenk (LinkedList<Objekat> objekatList ) { //kolizija prvog igraca sa svime
		return moze(objekatList, tenkIgrac.getTenkX(), tenkIgrac.getTenkY())?moguJa():false;
	}
	
	public boolean mozeTenkDva (LinkedList<Objekat> objekatList ) { //kolizija drugog igraca sa svime
		return moze(objekatList, tenkIgrac2.getTenkX(), tenkIgrac2.getTenkY())?moguJaDva():false;
	}
	
	public boolean mozeTenkPT (LinkedList<Objekat> objekatList ) {
		return moze(objekatList, tenkIgrac.getTenkX(), tenkIgrac.getTenkY())?moguJaPT():false;
	}
	
	public boolean mozeTenkDvaPT (LinkedList<Objekat> objekatList ) {
		return moze(objekatList, tenkIgrac2.getTenkX(), tenkIgrac2.getTenkY())?moguJaDvaPT():false;
	}
	
	public boolean krajNivoa () {
		if(mod == game_mode.MOD1) {
			for (int i=0; i<protivnik.length; i++)
				if (protivnik[i].isUbiven() == false) return false;
			return true;
		}
		if(mod == game_mode.MOD2) {
			for (int i=0; i<protivnikT.length; i++)
				if (protivnikT[i].isUbiven() == false) return false;
			return true;
		}
		return true;//ovo stoji ovde samo da zavara kompajler
	}
	
	public void pokupi () {
		for (int i=0; i<budzenje.length; i++) {
			PowerUp pu = budzenje[i];
			if (protivnik[i].isUbiven() && pu.isPokupljen()==false 
					&& (pu.getxKoord())<(tenkIgrac.getTenkX()+50) 
					&& (pu.getxKoord()+50)>tenkIgrac.getTenkX()
					&& (pu.getyKoord())<(tenkIgrac.getTenkY()+50) 
					&& (pu.getyKoord()+50)>tenkIgrac.getTenkY() ) {
				if(pu.getVrsta() == tip_powerup.HEALTH){
					if (!pu.isBod() && tenkIgrac.getTenk_HP()<20) {
						tenkIgrac.setTenk_HP(20);
						pu.setPokupljen(true);
					}
					else if (pu.isBod()) {
						tenkIgrac.setBodovi(bodovi[7]);
						pu.setPokupljen(true);
					}
				}
				else if(pu.getVrsta() == tip_powerup.SHIELD){
					if (!pu.isBod() && !tenkIgrac.isShield_flag()) {
						tenkIgrac.setShield_flag(true);
						pu.setPokupljen(true);
					}
					else if (pu.isBod()) {
						tenkIgrac.setBodovi(bodovi[7]);
						pu.setPokupljen(true);
					}
				}
			}
			
			if (dvaIgraca && protivnik[i].isUbiven() && pu.isPokupljen()==false 
					&& (pu.getxKoord())<(tenkIgrac2.getTenkX()+50) 
					&& (pu.getxKoord()+50)>tenkIgrac2.getTenkX()
					&& (pu.getyKoord())<(tenkIgrac2.getTenkY()+50) 
					&& (pu.getyKoord()+50)>tenkIgrac2.getTenkY() ) {
				if(pu.getVrsta() == tip_powerup.HEALTH){
					if (!pu.isBod() && tenkIgrac2.getTenk_HP()<20) {
						tenkIgrac2.setTenk_HP(20);
						pu.setPokupljen(true);
					}
					else if (pu.isBod()) {
						tenkIgrac2.setBodovi(bodovi[7]);
						pu.setPokupljen(true);
					}
				}
				else if(pu.getVrsta() == tip_powerup.SHIELD){
					if (!pu.isBod() && !tenkIgrac2.isShield_flag()) {
						tenkIgrac2.setShield_flag(true);
						pu.setPokupljen(true);
					}
					else if (pu.isBod()) {
						tenkIgrac2.setBodovi(bodovi[7]);
						pu.setPokupljen(true);
					}
				}
			}
		}
	}
	
	//Metode za racunanje pozicija protivnika
	
	public void pokupiKoordinate(LinkedList<Float> x, LinkedList<Float> y) {
		for(int i=0;i<protivnik.length;i++) {
			x.add(protivnik[i].getProtivnikX());
			y.add(protivnik[i].getProtivnikY());
		}
	}
	
	public boolean mozeProtivnik (Protivnik p, LinkedList<Float> x, LinkedList<Float> y) {	// kolizija protivnika medjusobno
		for(int i=0; i<protivnik.length; i++)
			if(protivnik[i].isUbiven() == false && protivnik[i].getVrsta() != tip_protivnika.HELIKOPTER)
				if(p!=protivnik[i]) {
					float kordX = x.get(i);
					float kordY = y.get(i);
					int sizeX = protivnik[i].getSizeX();
					int sizeY = protivnik[i].getSizeY();
			   		if (p.getProtivnikX() + p.getSizeX() >= kordX
			      		 && p.getProtivnikX() <= kordX + sizeX
			      		 && p.getProtivnikY() <= kordY + sizeY
			      		 && p.getProtivnikY() + p.getSizeY() >= kordY) {
						return false;
			   		}
				}
		return true;
	}
	
	public void azurirajKoordinate(Protivnik p, LinkedList<Float> x, LinkedList<Float> y, int delta) {
		for(int i=0; i<protivnik.length; i++) {
			if(protivnik[i].isUbiven() == false && protivnik[i].getVrsta() != tip_protivnika.TOP) {
				if(p != protivnik[i]) {
					int smer = protivnik[i].getSmer();
					float kordY = y.get(i);
					float kordX = x.get(i);
					if(smer == 0) y.set(i, kordY + delta * .1f);
					else if(smer == 1) y.set(i, kordY - delta * .1f);
					else if(smer == 2) x.set(i, kordX + delta * .1f);
					else x.set(i, kordX - delta * .1f);
				}
			}
		}
	}
	
	public void oziviSve () {
		mod = Nivo.getMod();
		dvaIgraca = Nivo.isDvaIgraca();
		if(mod == game_mode.MOD1) {
			for (int i=0; i<protivnik.length; i++) {
				protivnik[i].ozivi();
			}
		}
		postaviProtivnike();
		for (int i=0; i<budzenje.length; i++) {
			budzenje[i].setPokupljen(false);
		}
		quit = false;
		shot = false;
		shot2 = false;
		otvoriProlaz = false;
		resetProlaz();
	}
	
	public void moveUp (int delta, int ivica) {
		tenkIgrac.setTenk(tenkIgrac.getMovingUp());
		tenkIgrac.setAutoUpdate(true);
		tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		if (tenkIgrac.getTenkY()<ivica && krajNivoa() && tenkIgrac.getTenkX()>=460 && tenkIgrac.getTenkX()<514 && (otvoriProlaz==true)) {
			tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		}
		if (tenkIgrac.getTenkY() < ivica) {
			tenkIgrac.setTenkY(tenkIgrac.getTenkY() + delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac.setTenkY(tenkIgrac.getTenkY() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenk(kolizija.getObjekatList()))
				tenkIgrac.setTenkY(tenkIgrac.getTenkY() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkPT(kolizija.getObjekatList()))
				tenkIgrac.setTenkY(tenkIgrac.getTenkY() + delta * .1f * 1.5f);
		}
	}
	
	public void moveDown (int delta, int ivica) {
		tenkIgrac.setTenk(tenkIgrac.getMovingDown());
		tenkIgrac.setAutoUpdate(true);
		tenkIgrac.setTenkY(tenkIgrac.getTenkY() + delta * .1f * 1.5f);
		if (tenkIgrac.getTenkY() > ivica) {
			tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenk(kolizija.getObjekatList()))
				tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkPT(kolizija.getObjekatList()))
				tenkIgrac.setTenkY(tenkIgrac.getTenkY() - delta * .1f * 1.5f);
		}
	}
	
	public void moveLeft (int delta, int ivica) {
		tenkIgrac.setTenk(tenkIgrac.getMovingLeft());
		tenkIgrac.setAutoUpdate(true);
		tenkIgrac.setTenkX(tenkIgrac.getTenkX() - delta * .1f * 1.5f);
		if (tenkIgrac.getTenkX() < ivica) {
			tenkIgrac.setTenkX(tenkIgrac.getTenkX() + delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac.setTenkX(tenkIgrac.getTenkX() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenk(kolizija.getObjekatList()))
				tenkIgrac.setTenkX(tenkIgrac.getTenkX() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkPT(kolizija.getObjekatList()))
				tenkIgrac.setTenkX(tenkIgrac.getTenkX() + delta * .1f * 1.5f);
		}
	}
	
	public void moveRight (int delta, int ivica) {
		tenkIgrac.setTenk(tenkIgrac.getMovingRight());
		tenkIgrac.setAutoUpdate(true);
		tenkIgrac.setTenkX(tenkIgrac.getTenkX() + delta * .1f * 1.5f);
		if (tenkIgrac.getTenkX() > ivica) {
			tenkIgrac.setTenkX(tenkIgrac.getTenkX() - delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac.setTenkX(tenkIgrac.getTenkX() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenk(kolizija.getObjekatList()))
				tenkIgrac.setTenkX(tenkIgrac.getTenkX() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkPT(kolizija.getObjekatList()))
				tenkIgrac.setTenkX(tenkIgrac.getTenkX() - delta * .1f * 1.5f);
		}
	}
	
	public void moveUpDva (int delta, int ivica) {
		tenkIgrac2.setTenk(tenkIgrac2.getMovingUp());
		tenkIgrac2.setAutoUpdate(true);
		tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		if (tenkIgrac2.getTenkY()<ivica && krajNivoa() && tenkIgrac2.getTenkX()>=460 && tenkIgrac2.getTenkX()<514 && (otvoriProlaz==true)) {
			tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		}
		if (tenkIgrac2.getTenkY() < ivica) {
			tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() + delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenkDva(kolizija.getObjekatList()))
				tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkDvaPT(kolizija.getObjekatList()))
				tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() + delta * .1f * 1.5f);
		}
	}
	
	public void moveDownDva (int delta, int ivica) {
		tenkIgrac2.setTenk(tenkIgrac2.getMovingDown());
		tenkIgrac2.setAutoUpdate(true);
		tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() + delta * .1f * 1.5f);
		if (tenkIgrac2.getTenkY() > ivica) {
			tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenkDva(kolizija.getObjekatList()))
				tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkDvaPT(kolizija.getObjekatList()))
				tenkIgrac2.setTenkY(tenkIgrac2.getTenkY() - delta * .1f * 1.5f);
		}
	}
	
	public void moveLeftDva (int delta, int ivica) {
		tenkIgrac2.setTenk(tenkIgrac2.getMovingLeft());
		tenkIgrac2.setAutoUpdate(true);
		tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() - delta * .1f * 1.5f);
		if (tenkIgrac2.getTenkX() < ivica) {
			tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() + delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenkDva(kolizija.getObjekatList()))
				tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() + delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkDvaPT(kolizija.getObjekatList()))
				tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() + delta * .1f * 1.5f);
		}
	}
	
	public void moveRightDva (int delta, int ivica) {
		tenkIgrac2.setTenk(tenkIgrac2.getMovingRight());
		tenkIgrac2.setAutoUpdate(true);
		tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() + delta * .1f * 1.5f);
		if (tenkIgrac2.getTenkX() > ivica) {
			tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() - delta * .1f * 1.5f);
		}
		if (dvaIgraca && !mozeIgrac()) {
			tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD1) {
			if(!mozeTenkDva(kolizija.getObjekatList()))
				tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() - delta * .1f * 1.5f);
		}
		if(mod == game_mode.MOD2) {
			if(!mozeTenkDvaPT(kolizija.getObjekatList()))
				tenkIgrac2.setTenkX(tenkIgrac2.getTenkX() - delta * .1f * 1.5f);
		}
	}
	
	public void fullScreenOnOff (GameContainer gc) throws SlickException {
		if (gc.getInput().isKeyDown(Input.KEY_F)) {
			if (gc.isFullscreen()) {
				gc.setFullscreen(false);
			}
			else {
				gc.setFullscreen(true);
			}
		}
	}
	
	public void mainMenu (StateBasedGame sbg) throws SlickException {
		tenkIgrac.ozivi();
		if (dvaIgraca)
			tenkIgrac2.ozivi();
		//Nivo.resetLevel();
		sbg.enterState(0);
	}
	
	public void crtajPauzu (Graphics g) {
		Color stara = g.getColor();
		
		g.setColor(Color.black);
		g.fillRect(450, 340, 135, 140);
		g.setColor(Color.white);
		g.drawString("Resume (R)", 460, 350);
		g.drawString("Main Menu (M)" , 460, 400);
		g.drawString("Quit (Q)", 460, 450);
		
		g.setColor(stara);
	}

}
